package org.mca.mcaweb.bean;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.mca.mcaweb.dao.DAO;
import org.mca.mcaweb.entity.Vwprodsaldodisponivelvenda;;


@Named
@ViewScoped
public class VwprodsaldodisponivelvendaBean implements Serializable {

	private static final long serialVersionUID = 2810930627057811568L;
	
	private Vwprodsaldodisponivelvenda vwprodsaldodisponivelvenda = new Vwprodsaldodisponivelvenda();
	
	private List<Vwprodsaldodisponivelvenda> vwprodsaldodisponivelvendas = new ArrayList<Vwprodsaldodisponivelvenda>(0);
	
	private List<Vwprodsaldodisponivelvenda> listVwprodsaldodisponivelvenda;
	
	private String filtro;
	
	private boolean consultar = false;
	
	private static final String SQL_CONSULTA_SALDO_DISPONIVEL = "select trim(VW.ProdCodigo),"
			+ " VW.ProdDescricao,"
			+ " VW.ProdNomeFantasia,"
			+ " VW.ProdModelo,"
			+ " VW.ProdReferencia,"
			+ " VW.ProdPeso,"
			+ " VW.ProdAltura,"
			+ " VW.ProdLargura,"
			+ " VW.ProdProfundidade,"
			+ " VW.ProdEmprPreco1,"
			+ " VW.ProdEmprPreco2,"
			+ " VW.ProdEmprPreco3,"
			+ " VW.ProdEmprPreco4,"
			+ " VW.ProdEmprPreco1Fiscal,"
			+ " VW.ProdEmprPreco2Fiscal,"
			+ " VW.ProdEmprPreco3Fiscal,"
			+ " VW.ProdEmprPreco4Fiscal,"
			+ " CASE WHEN E.EmprPermiteEstoqueCasaDecimal = 'S' AND E.EmprProdutoCasasDecimais  IS NOT NULL THEN"
			+ "     ROUND(VW.SaldoVenda,E.EmprProdutoCasasDecimais)"
			+ " ELSE "
			+ "     VW.SaldoVenda "
			+ " END SaldoVenda,"
			+ " CASE WHEN E.EmprPermiteEstoqueCasaDecimal = 'S' AND E.EmprProdutoCasasDecimais  IS NOT NULL THEN"
			+ "     ROUND(VW.SaldoBloqueado,E.EmprProdutoCasasDecimais) "
			+ " ELSE "
			+ "     VW.SaldoBloqueado "
			+ " END SaldoBloqueado,"
			+ " TP.TipoProd3Descricao"
			+ " from vwProdSaldoDisponivelVenda VW"
			+ " join Empr E on vw.EmprCodigo = E.EmprCodigo"
			+ " left join TipoProd3 TP on (VW.TipoProd3Codigo  = TP.TipoProd3Codigo )   "
			+ " where VW.EmprCodigo     = :emprCodigo "
			+ " AND exists (select null "
			+ "      FROM AGRULOJALOJA AL JOIN LOJA LJ ON (AL.EMPRCODIGO = LJ.EMPRCODIGO "
			+ "                        AND AL.LOJACODIGO = LJ.LOJACODIGO) "
			+ "           JOIN USUA US ON (US.EMPRCODIGO = LJ.EMPRCODIGO  "
			+ "                        AND US.lojacodigo = LJ.LOJACODIGO) "
			+ "          WHERE US.EMPRCODIGO     = VW.EmprCodigo          "
			+ "                        AND AL.AgruLojaCodigo = VW.AgruLojaCodigo "
			+ "            AND US.USUACODIGO     = :usuaCodigo)";
	
	
	@Inject
	private LoggedUser loggedUser;
	
	@Inject
	private DAO<Vwprodsaldodisponivelvenda> dao;


	@PostConstruct
	public void init() {
		Date hms = new Date();
		System.out.println("Inicio: " + hms.getHours() + ":" + hms.getMinutes() + ":" + hms.getSeconds() + "-" +  Calendar.MILLISECOND);
		
		
		@SuppressWarnings("unchecked")
		List<Object[]> resultado = dao.getEm().createNativeQuery(SQL_CONSULTA_SALDO_DISPONIVEL)
				.setParameter("emprCodigo",	loggedUser.getEmpr().getEmprcodigo())
				.setParameter("usuaCodigo",	loggedUser.getUsua().getUsuacodigo()).getResultList();
		
		Iterator<Object[]> iter = resultado.iterator();
		while (iter.hasNext()) {
		    Object[] row = iter.next();
		     
		    Vwprodsaldodisponivelvenda vw = new Vwprodsaldodisponivelvenda();
		    vw.setProdcodigo(row[0].toString());
		    vw.setProddescricao(row[1].toString());
		    vw.setProdnomefantasia(row[2].toString());
		    vw.setProdmodelo(row[3].toString());
		    vw.setProdreferencia(row[4].toString());
		    vw.setProdpeso(new BigDecimal(row[5].toString()));
		    vw.setProdaltura(new BigDecimal(row[6].toString()));
		    vw.setProdlargura(new BigDecimal(row[7].toString()));
		    vw.setProdprofundidade(new BigDecimal(row[8].toString()));
		    vw.setProdemprpreco1(new BigDecimal(row[9].toString()));
		    vw.setProdemprpreco2(new BigDecimal(row[10].toString()));
		    vw.setProdemprpreco3(new BigDecimal(row[11].toString()));
		    vw.setProdemprpreco4(new BigDecimal(row[12].toString()));
		    vw.setProdemprpreco1fiscal(Integer.parseInt(row[13].toString()));
		    vw.setProdemprpreco2fiscal(Integer.parseInt(row[14].toString()));
		    vw.setProdemprpreco3fiscal(Integer.parseInt(row[15].toString()));
		    vw.setProdemprpreco4fiscal(Integer.parseInt(row[16].toString()));
		    vw.setSaldovenda(Integer.parseInt(row[17].toString()));
		    vw.setSaldobloqueado(Integer.parseInt(row[18].toString()));

		    vwprodsaldodisponivelvendas.add(vw);
		    
		}
//		vwprodsaldodisponivelvendas.addAll(listVwprodsaldodisponivelvenda);
		System.out.println("Fim: " + hms.getHours() + ":" + hms.getMinutes() + ":" + hms.getSeconds() + "-" +  Calendar.MILLISECOND);
	}
	
	
	public void clear() {
		this.vwprodsaldodisponivelvenda = new Vwprodsaldodisponivelvenda();
	}
	
	public Vwprodsaldodisponivelvenda getVwprodsaldodisponivelvenda() {
		return vwprodsaldodisponivelvenda;
	}

	public void setVwprodsaldodisponivelvenda(Vwprodsaldodisponivelvenda vwprodsaldodisponivelvenda) {
		this.vwprodsaldodisponivelvenda = vwprodsaldodisponivelvenda;
	}

	public List<Vwprodsaldodisponivelvenda> getVwprodsaldodisponivelvendas() {
		return vwprodsaldodisponivelvendas;
	}

	public void setVwprodsaldodisponivelvendas(List<Vwprodsaldodisponivelvenda> vwprodsaldodisponivelvendas) {
		this.vwprodsaldodisponivelvendas = vwprodsaldodisponivelvendas;
	}

	public String getFiltro() {
		return filtro;
	}

	public void setFiltro(String filtro) {
		this.filtro = filtro;
	}

	public List<Vwprodsaldodisponivelvenda> getListVwprodsaldodisponivelvenda() {
		return listVwprodsaldodisponivelvenda;
	}

	public void setListVwprodsaldodisponivelvenda(List<Vwprodsaldodisponivelvenda> listVwprodsaldodisponivelvenda) {
		this.listVwprodsaldodisponivelvenda = listVwprodsaldodisponivelvenda;
	}

	public boolean isConsultar() {
		return consultar;
	}

	public void setConsultar(boolean consultar) {
		this.consultar = consultar;
	}
}